package com.sky.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sky.properties.WeChatPayProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

/**
 * 模拟微信支付工具类
 * 用于在没有真实微信支付环境的情况下模拟支付流程
 */
@Component
@Slf4j
public class MockWeChatPayUtil {

    @Autowired
    private WeChatPayProperties weChatPayProperties;

    /**
     * 模拟微信支付下单
     *
     * @param orderNum    商户订单号
     * @param total       总金额
     * @param description 商品描述
     * @param openid      微信用户的openid
     * @return 模拟的支付参数
     */
    public JSONObject pay(String orderNum, BigDecimal total, String description, String openid) {
        log.info("模拟微信支付下单开始: 订单号={}, 金额={}, 商品描述={}, 用户openid={}", 
                orderNum, total, description, openid);

        // 检查必要参数
        if (orderNum == null || total == null || description == null || openid == null) {
            throw new IllegalArgumentException("支付参数不能为空");
        }

        try {
            // 模拟生成预支付交易单
            String prepayId = generatePrepayId();
            
            // 构造返回给前端的支付参数
            JSONObject result = new JSONObject();
            result.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
            result.put("nonceStr", RandomStringUtils.randomAlphanumeric(32));
            result.put("package", "prepay_id=" + prepayId);
            result.put("signType", "RSA");
            result.put("paySign", generateMockSign());
            
            log.info("模拟微信支付下单成功，预支付交易单号: {}", prepayId);
            
            return result;
        } catch (Exception e) {
            log.error("模拟微信支付下单失败", e);
            JSONObject errorResult = new JSONObject();
            errorResult.put("code", "FAIL");
            errorResult.put("message", "支付下单失败");
            return errorResult;
        }
    }

    /**
     * 模拟微信退款申请
     *
     * @param outTradeNo  商户订单号
     * @param outRefundNo 商户退款单号
     * @param refund      退款金额
     * @param total       原订单金额
     * @return 模拟的退款结果
     */
    public String refund(String outTradeNo, String outRefundNo, BigDecimal refund, BigDecimal total) {
        log.info("模拟微信退款申请开始: 商户订单号={}, 退款单号={}, 退款金额={}, 原订单金额={}",
                outTradeNo, outRefundNo, refund, total);

        // 检查必要参数
        if (outTradeNo == null || outRefundNo == null || refund == null || total == null) {
            throw new IllegalArgumentException("退款参数不能为空");
        }

        try {
            // 构造模拟退款响应
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("refund_id", generateRefundId()); // 微信退款单号
            resultMap.put("out_trade_no", outTradeNo); // 商户订单号
            resultMap.put("out_refund_no", outRefundNo); // 商户退款单号
            resultMap.put("refund", refund.multiply(BigDecimal.valueOf(100)).intValue()); // 退款金额(单位:分)
            resultMap.put("total", total.multiply(BigDecimal.valueOf(100)).intValue()); // 原订单金额(单位:分)
            resultMap.put("success_time", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); // 退款成功时间
            
            Map<String, Object> statusMap = new HashMap<>();
            statusMap.put("code", "SUCCESS"); // 退款状态
            statusMap.put("message", "成功");
            resultMap.put("status", statusMap);
            
            String resultJson = JSON.toJSONString(resultMap);
            log.info("模拟微信退款申请成功: {}", resultJson);
            
            return resultJson;
        } catch (Exception e) {
            log.error("模拟微信退款申请失败", e);
            Map<String, Object> resultMap = new HashMap<>();
            Map<String, Object> statusMap = new HashMap<>();
            statusMap.put("code", "FAIL");
            statusMap.put("message", "退款申请失败");
            resultMap.put("status", statusMap);
            return JSON.toJSONString(resultMap);
        }
    }

    /**
     * 生成模拟的预支付交易单号
     * 
     * @return 模拟的预支付交易单号
     */
    private String generatePrepayId() {
        return "wx" + System.currentTimeMillis() + RandomStringUtils.randomNumeric(10);
    }

    /**
     * 生成模拟的退款单号
     * 
     * @return 模拟的退款单号
     */
    private String generateRefundId() {
        return "ref" + System.currentTimeMillis() + RandomStringUtils.randomNumeric(12);
    }

    /**
     * 生成模拟的签名
     * 
     * @return 模拟的签名字符串
     */
    private String generateMockSign() {
        return RandomStringUtils.randomAlphanumeric(64);
    }
}